// // Config
// const config = {
//   // 文件夹开始
//   folderStart: "Vin.",
//   // 排除文件夹开始
//   excludeFolderStart: "Vin.WebApi",
//   // Nuget文件存储路径
//   nugetDir: "D:\\Nuget",
// };

// const path = require("path");
// const fs = require("fs");
// const exec = require("child_process").exec;
// const cwd = process.cwd();

// // 获取Nuget路径
// const getNugetDir = () => {
//   return config.nugetDir || path.join(cwd, "dist");
// };

// // 判断并创建文件夹
// const checkAndCreateDir = (dir) => {
//   if (!fs.existsSync(dir)) {
//     // 创建目录
//     fs.mkdirSync(dir, {
//       recursive: true,
//     });
//   }
// };

// // 获取当前目录下的所有包文件夹
// const packageDirs = () => {
//   return fs.readdirSync(cwd).filter((dir) => {
//     // 排除dist文件夹
//     return (
//       dir.startsWith(config.folderStart) &&
//       !dir.startsWith(config.excludeFolderStart) &&
//       fs.statSync(dir).isDirectory()
//     );
//   });
// };

// // 2. 移动文件到dist文件夹
// const copyFiles = (sourceFileList, targetDir) => {
//   // 判断并创建文件夹
//   checkAndCreateDir(targetDir);
//   // 复制文件
//   sourceFileList.forEach((file) => {
//     fs.copyFileSync(file, path.join(targetDir, path.basename(file)));
//   });
// };

// // 执行打包命令
// const init = async () => {
//   // 1. 打包
//   exec(
//     "dotnet msbuild -t:rebuild -p:Configuration=Release",
//     (error, stdout, stderr) => {
//       if (error) {
//         console.error(`打包失败: ${error}`);
//         return;
//       }
//       // 2. 移动文件到dist文件夹
//       checkAndCreateDir(getNugetDir());
//       const dirs = packageDirs();
//       dirs.forEach((dir) => {
//         var releasePackage = path.join(cwd, dir, "bin", "Release");
//         var files = fs
//           .readdirSync(releasePackage)
//           .filter((file) => file.endsWith(".nupkg"))
//           .map((file) => path.join(releasePackage, file));
//         copyFiles(files, path.join(getNugetDir(), dir));
//       });
//       console.log("打包成功");
//     }
//   );
// };

// init();

// Config
const config = {
  // 文件夹开始
  folderStart: "Vin.",
  // 排除文件夹开始
  excludeFolderStart: "Vin.WebApi",
  // Nuget文件存储路径
  nugetDir: "D:\\Nuget",
};

const path = require("path");
const fs = require("fs");
const exec = require("child_process").exec;
const cwd = process.cwd();

// 获取Nuget路径
const getNugetDir = () => {
  return config.nugetDir || path.join(cwd, "dist");
};

// 判断并创建文件夹
const checkAndCreateDir = (dir) => {
  if (!fs.existsSync(dir)) {
    // 创建目录
    fs.mkdirSync(dir, {
      recursive: true,
    });
  }
};

// 获取当前目录下的所有包文件夹
const packageDirs = () => {
  // 查询所有包含Release文件夹的文件夹
  return [
    ...new Set(
      fs
        .readdirSync(cwd, {
          recursive: true,
        })
        .filter((m) => m.indexOf("Release") > -1)
        .map((m) => m.split("Release")[0] + "Release")
    ),
  ];
};

// 2. 移动文件到dist文件夹
const copyFiles = (sourceFileList, targetDir) => {
  // 判断并创建文件夹
  checkAndCreateDir(targetDir);
  // 复制文件
  sourceFileList.forEach((file) => {
    fs.copyFileSync(file, path.join(targetDir, path.basename(file)));
  });
};

// 执行打包命令
const init = async () => {
  // 1. 打包
  exec(
    "dotnet msbuild -t:rebuild -p:Configuration=Release",
    { maxBuffer: 2048 * 2048, timeout: 1000 * 60 * 10 },
    (error, stdout, stderr) => {
      if (error) {
        console.error(`打包失败: ${error}, ${stderr}`);
        return;
      }
      // 2. 移动文件到nuget文件夹
      checkAndCreateDir(getNugetDir());
      const dirs = packageDirs();
      dirs.forEach((dir) => {
        var releasePackage = path.join(cwd, dir);
        var files = fs
          .readdirSync(releasePackage)
          .filter((file) => file.endsWith(".nupkg"))
          .map((file) => path.join(releasePackage, file));
        if (files.length > 0) {
          files.forEach((nupkg) => {
            var nameArr = nupkg.split("\\");
            var binIndex = nameArr.indexOf("bin");
            copyFiles(files, path.join(getNugetDir(), nameArr[binIndex - 1]));
          });
        }
      });
      console.log("打包成功");
    }
  );
};

init();
